perm filename STEP5.SAI[DOC,TOB] blob
sn#078288 filedate 1973-12-14 generic text, type T, neo UTF8
00100 comment
00200 this package generates fake edges in an array
00300 The variables involved are:
00400 step_amplitude the step half height
00500 step_mean mean value of step
00600 noise_std rms error of gaussian noise
00700 theta angle of edge
00800 rho perpendicular distance of edge
00900 lambda the wavelength transverse to edge
01000
01100 the perpendicular distance from the edge is
01200 n→.r→+rho
01300 cx*x+cy*y+rho
01400 in terms of normal;
00100 REQUIRE "RANDOM.HDR[S,TOB]" SOURCE_FILE;
00200
00300 SHORT REAL PROCEDURE GAUSS;
00350 comment gaussian random number, true gaussian distribution;
00400 BEGIN "GAUSS"
00500 RETURN (SQRT(-2.0*LOG(RANDOM))*SIN(TWOPI*RANDOM));
00600 END "GAUSS";
00700
00800 SHORT REAL PROCEDURE NOISE(SHORT REAL VALUE,NOISE_STD);
00850 comment gaussian noise;
00900 BEGIN "NOISE"
01000 RETURN (VALUE+GAUSS*NOISE_STD);
01100 END "NOISE";
01200
01300 SHORT REAL PROCEDURE STEP_FUN(SHORT REAL STEP_MEAN,
01400 STEP_AMPLITUDE,PHASE);
01450 comment step function with linear shift between;
01500 BEGIN "STEP"
01555 IF PHASE>1.0 THEN PHASE←1.0;
01560 IF PHASE<-1.0 THEN PHASE←-1.0;
01565 RETURN (PHASE*STEP_AMPLITUDE+STEP_MEAN);
01900 END "STEP";
02000
02100 SHORT REAL PROCEDURE NOISY_STEP( SHORT REAL STEP_MEAN,
02200 STEP_AMPLITUDE,PHASE,NOISE_STD);
02250 comment noisy step function;
02300 BEGIN
02400 RETURN(NOISE(STEP_FUN(STEP_MEAN,STEP_AMPLITUDE,PHASE),NOISE_STD));
02500 END;
02600
02700
02800
02900 COMMENT MAKE UP A STEP EDGE (OF TYPE FUNARG, IE STEP OR COS)
03000 ABOUT A LINE SPECIFIED BY
03100 STEP_THETA,STEP_RHO WITH WAVELENGTH LAMBDA;
03200
03300 PROCEDURE FAKE (SHORT INTEGER ROWS,COLUMNS;SHORT REAL THETA,RHO,LAMBDA,
03400 STEP_MEAN,STEP_AMPLITUDE,NOISE_STD;
03500 REAL PROCEDURE FUNARG;INTEGER ARRAY VALUES);
03600 BEGIN "FAKE"
03700 SHORT REAL PHASE;
03800 REAL X0,Y0,X1,COSA,SINA;
03900 SHORT INTEGER VALUE;
04000 SHORT INTEGER VMAX;
04100 INTEGER PTR,PTR1;
04200 INTEGER ROW,COLUMN;
04300 LABEL FKSTR;
04400 VMAX←2↑BITS-1;
04500 COSA←COS(THETA);
04600 SINA←SIN(THETA);
04700 IFC 0 THENC PRINT(THETA);PRINT(COSA);PRINT(SINA);TCRLF;ENDC;
04800 X0←(COLUMNS+1)*0.5;
04900 Y0←(ROWS+1)*0.5;
05000
05100 PTR←BPOINT(BITS,VALUES[1],0);
05200 FOR COLUMN←1 STEP 1 UNTIL COLUMNS DO BEGIN
05300 PTR1←PTR;
05400 PTR←PTR+LINLEN;
05500 X1←(COLUMN-X0)*COSA+RHO;
05600 FOR ROW←1 STEP 1 UNTIL ROWS DO BEGIN
05700 PHASE←X1+(ROW-Y0)*SINA;
05800 VALUE←0.5+NOISY_STEP(STEP_MEAN,STEP_AMPLITUDE,PHASE,NOISE_STD);
05900 IF VALUE<0 THEN VALUE←0;
06000 IF VALUE>VMAX THEN VALUE←VMAX;
06100 FKSTR: IDPB(VALUE,PTR1);
06300 IFC 0 THENC PRINT(ROW);PRINT(COLUMN);PRINT(PHASE);PRINT(STEP_VALUE);PRINT(CRLF);INCHWL; ENDC;
06400 END;
06500 END;
06600 END "FAKE";
06700